public class SimpleGC {
    /**
     * 16
     *
     * @param args
     */

    public static void main(String[] args)

    {

        demo();

    }


    /**
     * VM arg：-verbose:gc -Xms200M -Xmx200M -Xmn100M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:+PrintTenuringDistribution
     */
    @SuppressWarnings("unused")
    public static void demo() {

        /*total Heap Size:200M */
        /*年轻代：100M;年老代：100M；新生代：80+10=90M*/
        /*Eden:80M  From:10M   To:10M */

        final int tenMB = 10 * 1024 * 1024;


        byte[] alloc1, alloc2, alloc3;


        alloc1 = new byte[tenMB / 5];
        // 在新生代的eden区分配2M的空间存储对象,Eden=78M,From:10M,To:10M,Old:100M

        alloc2 = new byte[5 * tenMB];
        // 在新生代的eden区分配50M的空间存储对象 Eden=28M,From:10M,To:10M,Old:100M

        /*还是尝试在eden上分配，但是eden空间只剩下28M，不能容纳alloc3要求的40M空间。
        于是触发在新生代上的一次gc,将Eden区的存活对象转移到Survivor区。在这个里先将2M的alloc1对象存放
        （其实是copy，参见java 垃圾回收策略的描述）到from区，然后copy 50M的alloc2对象，
        显然survivor区不能容纳下alloc2对象，该对象被直接copy到年老代。
        需要说明的是复制到Survivor区的对象在经历一次gc后期对象年龄会被加一。*/
//
//GC后：       Eden=80M,From:8M,To:10M,Old:50M
        alloc3 = new byte[4 * tenMB];
//       Eden=40M,From:8M,To:10M,Old:50M


        alloc3 = null;
//       Eden上的 alloc3 40M变为可回收状态，alloc3对象不可用

        /*
        还是尝试在eden上分配，但是eden空间只剩下40M，不能容纳alloc3要求的60M空间，则再次触发新生代上的一次gc。
        首先eden上分配的40M对象因为没有被再使用，则直接被回收
        */
//        而根据的设置不同，这次gc的行为会稍有不同
        /*先看MaxTenuringThreshold不设置，即取默认值15的时候。eden区上无用的40M回收后，再考察Survivor区域的对象是否满足对象
        晋升老年代的年龄阈值，发现from中的2M对象，年龄是1，不满足晋升条件，则不被处理，只是把Survivor区域的经历这次回收未被处理
        的对象age加一。
        */
        /*再看看当MaxTenuringThreshold设置为1的情况。同样eden区上无用的40M回收后，再考察Survivor区域的对象是否满足对象晋升老年
        代的年龄阈值，发现from中的2M对象，年龄是1，满足晋升条件，则Survivor区域满足年龄的对象被拷贝到年老区。
        */
//   MaxTenuringThreshold=15-》 Eden=80M,From:8M,To:10M,Old:50M
//   MaxTenuringThreshold=1-》 Eden=80M,From:10M,To:10M,Old:52M
        alloc3 = new byte[6 * tenMB];
//   MaxTenuringThreshold=15-》 Eden=20M,From:8M,To:10M,Old:50M
//   MaxTenuringThreshold=1-》 Eden=20M,From:10M,To:10M,Old:52M
    }

}
